﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using Servidor;

namespace Dataloading
{
    class Dia
    {
        private dbEntities db;
        public string Nombre {  
            get{
                CultureInfo ci = new CultureInfo("Es-Es");
                return ci.TextInfo.ToTitleCase(ci.DateTimeFormat.GetDayName(((DayOfWeek)this.Numero)));
            }
        }
        public int Numero { get; private set; }
        
        // Constructor
        public Dia(int numeroDia)
        {
            this.Numero = numeroDia;
            this.db = new dbEntities();
            
        }

        public List<TipoJuego> GetJuegos()
        {
            ControladorJuego controlador = new ControladorJuego();
            return controlador.FindByDia(this.Numero);
        }

        private List<Dias> GetDias()
        {
            // Lista de los juegos de un día en particular
            return db.Dias.Where(d => d.Dia == this.Numero).ToList<Dias>(); 
        }

        public void SetJuegos(List<TipoJuego> juegosASetear)
        {
            List<TipoJuego> juegosActuales = this.GetJuegos();

            // Obtengo los nuevos juegos, si hay.
            List<TipoJuego> juegosNuevos = juegosASetear.Except(juegosActuales).ToList();

            // Obtengo los juegos que hay que eliminar, si hay.
            List<TipoJuego> juegosAEliminar = juegosActuales.Except(juegosASetear).ToList();

            this.DeleteFromDataBase(juegosAEliminar);
            this.InsertarIntoDataBase(juegosNuevos);
        }

        private void DeleteFromDataBase(List<TipoJuego> juegosAEliminar)
        {
            ControladorJuego controlador = new ControladorJuego();
            foreach (var d in db.Dias.Where(d => d.Dia == this.Numero))
            {
                d.JuegoReference.Load();
                TipoJuego juego = controlador.CrearJuegoEspecifico(d.Juego);
                if (juegosAEliminar.Any(j => j.Id == juego.Id)) db.DeleteObject(d);
            }
            
            db.SaveChanges();
        }

        private void InsertarIntoDataBase(List<TipoJuego> juegos)
        {
            foreach(TipoJuego tipoJuego in juegos)
            {
                Juego juego = db.Juego.First(j => j.IdJuego == tipoJuego.juego.IdJuego); // Esto es una atadura con alambre pero lo hago porque tira excepción sino.
                Dias d = new Dias {
                                    Dia = this.Numero,
                                    Juego = juego
                                   };
                
                db.AddToDias(d);
                try
                {
                    db.SaveChanges();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
            
         }
    }
}
